package com.jxgyl.gateway.filter;

import com.alibaba.fastjson.JSON;
import com.jxgyl.common.data.AjaxResult;
import com.jxgyl.gateway.config.UrlConfig;
import lombok.extern.log4j.Log4j2;
import lombok.val;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;
import java.util.Arrays;

/**
 * @program: middleplatform
 * @description: 过滤器
 *GatewayFilter：
 *  * 需要通过spring.cloud.routes.filters 配置在具体路由下，
 *  * 只作用在当前路由上或通过spring.cloud.default-filters配置在全局，作用在所有路由上。
 *  * 需要用代码的形式，配置一个RouteLocator，里面写路由的配置信息。
 *    不能直接在nacos上配置，自定义过滤器才可以配置
 *    想直接使用gatewayFilter的话，需要在代码中定义
 *     @Bean
 *     public RouteLocator routeLocator(RouteLocatorBuilder builder) {
 *         log.info("ServerGatewayFilter filtet........");
 *         return builder.routes()
 *                 .route(r ->
 *                         r.path("/server/**")
 *                                 .filters(
 *                                         f -> f.stripPrefix(1)
 *                                                 .filters(new UrlFilter())
 *                                 )
 *                                 .uri("lb://cloud-discovery-server")
 *                 )
 *                 .build();
 *     }
 *  *
 *  * GlobalFilter：
 *  * 全局过滤器，不需要在配置文件中配置，作用在所有的路由上，最终通过GatewayFilterAdapter包装成GatewayFilterChain可识别的过滤器，
 *  * 它为请求业务以及路由的URI转换为真实业务服务的请求地址的核心过滤器，不需要配置，系统初始化时加载，并作用在每个路由上。
 *  * 代码配置需要声明一个GlobalFilter对象。
 *
 * @author: Wanglipeng
 * @create: 2022-01-21 14:24
 **/
@Component
@Log4j2
public class UrlFilter implements GatewayFilter, Ordered {
    @Resource
    UrlConfig urlConfig;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        /**
         * 自定义的过滤器获取的地址是router转发的地址
         */
        ServerHttpResponse response = exchange.getResponse();
        log.info("urlFilter_test");
        log.info("urlConfig="+urlConfig.getInterceptUrls());
        Arrays.stream(urlConfig.getInterceptUrls()).forEach(s ->log.info(s));
        log.info(exchange.getRequest().getURI().getPath());
        if(!exchange.getRequest().getURI().getPath().contains("test2")){
            //请求不通过，直接返回
            return exchange.getResponse().writeWith(
                    Mono.just(response.bufferFactory().wrap(JSON.toJSONBytes(AjaxResult.error("请求不通过")))));
        }
        return chain.filter(exchange);
    }

    /*Ordered 负责filter的顺序，数字越小越优先，越靠前。*/
    @Override
    public int getOrder() {
        return 1;
    }
}
